﻿// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED.
// THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License.
// LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License")
// YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License.
// YOU MAY OBTAIN A COPY OF THE LICENSE AT
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
// DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
// LIMITATIONS UNDER THE License.
// GITEE: https://gitee.com/AntdUI/AntdUI
// GITHUB: https://github.com/AntdUI/AntdUI
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620

using System;
using System.Drawing;
using System.Windows.Forms;

namespace AntdUI
{
    /// <summary>
    /// 右键菜单
    /// </summary>
    public static class ContextMenuStrip
    {
        /// <summary>
        /// ContextMenuStrip 右键菜单
        /// </summary>
        /// <param name="control">所属控件</param>
        /// <param name="call">点击回调</param>
        /// <param name="items">内容</param>
        public static Form open(Control control, Action<ContextMenuStripItem> call, IContextMenuStripItem[] items, int sleep = 0)
        {
            return open(new Config(control, call, items, sleep));
        }

        /// <summary>
        /// ContextMenuStrip 右键菜单
        /// </summary>
        /// <param name="control">所属控件</param>
        /// <param name="notifyIcon">托盘</param>
        /// <param name="call">点击回调</param>
        /// <param name="items">内容</param>
        public static Form open(Control control, NotifyIcon notifyIcon, Action<ContextMenuStripItem> call, IContextMenuStripItem[] items, int sleep = 0)
        {
            return open(new Config(control, call, items, sleep)
            {
                TopMost = true,
                Align = TAlign.TL
            });
        }

        /// <summary>
        /// ContextMenuStrip 右键菜单
        /// </summary>
        /// <param name="config">配置</param>
        public static Form open(this Config config)
        {
            if (config.Control.IsHandleCreated)
            {
                if (config.Control.InvokeRequired) return ITask.Invoke(config.Control, new Func<Form>(() => open(config)));
                var frm = new LayeredFormContextMenuStrip(config);
                frm.Show(config.Control);
                return frm;
            }
            return null;
        }

        /// <summary>
        /// 配置
        /// </summary>
        public class Config
        {
            public Config(Control control, Action<ContextMenuStripItem> call, IContextMenuStripItem[] items, int sleep = 0)
            {
                Control = control;
                Call = call;
                Items = items;
                CallSleep = sleep;
            }

            /// <summary>
            /// 所属控件
            /// </summary>
            public Control Control { get; set; }

            /// <summary>
            /// 菜单内容
            /// </summary>
            public IContextMenuStripItem[] Items { get; set; }

            /// <summary>
            /// 字体
            /// </summary>
            public Font Font { get; set; }

            int _radius = 6;
            /// <summary>
            /// 圆角
            /// </summary>
            public int Radius
		    {
	        	get { return _radius; }
	        	set { _radius = value; }
		    }            

            /// <summary>
            /// 是否置顶
            /// </summary>
            public bool TopMost { get; set; }

            /// <summary>
            /// 延迟回调
            /// </summary>
            public int CallSleep { get; set; }

            /// <summary>
            /// 是否抢占焦点
            /// </summary>
            public bool UFocus { get; set; }

            /// <summary>
            /// 坐标
            /// </summary>
            public Point? Location { get; set; }

            TAlign _align = TAlign.BR;
            /// <summary>
            /// 方向
            /// </summary>
            public TAlign Align
            {
	        	get { return _align; }
	        	set { _align = value; }
		    }

            /// <summary>
            /// 点击回调
            /// </summary>
            public Action<ContextMenuStripItem> Call { get; set; }
        }
    }

    /// <summary>
    /// 右键菜单项
    /// </summary>
    public class ContextMenuStripItem : IContextMenuStripItem
    {
        /// <summary>
        /// 右键菜单项
        /// </summary>
        /// <param name="text">文本</param>
        public ContextMenuStripItem(string text)
        {
            _text = text;
        }

        /// <summary>
        /// 右键菜单项
        /// </summary>
        /// <param name="text">文本</param>
        /// <param name="subtext">子文本</param>
        public ContextMenuStripItem(string text, string subtext)
        {
            _text = text;
            subText = subtext;
        }

        /// <summary>
        /// ID
        /// </summary>
        public string ID { get; set; }

        string _text;
        /// <summary>
        /// 文本
        /// </summary>
        public string Text
        {
        	get { return Localization.GetLangIN(LocalizationText, _text, new string[] { "{id}", ID }); }
            set { _text = value; }
        }

        /// <summary>
        /// 国际化（文本）
        /// </summary>
        public string LocalizationText { get; set; }

        string subText = null;
        /// <summary>
        /// 子文本
        /// </summary>
        public string SubText
        {
        	get { return Localization.GetLangI(LocalizationSubText, subText, new string[] { "{id}", ID }); }
        	set { subText = value; }
        }

        /// <summary>
        /// 国际化（子文本）
        /// </summary>
        public string LocalizationSubText { get; set; }

        /// <summary>
        /// 文字颜色
        /// </summary>
        public Color Fore { get; set; }

        /// <summary>
        /// 图标
        /// </summary>
        public Image Icon { get; set; }

        /// <summary>
        /// 图标SVG
        /// </summary>
        public string IconSvg { get; set; }

        bool _enabled = true;
        /// <summary>
        /// 使能
        /// </summary>
        public bool Enabled
		{
        	get { return _enabled; }
        	set { _enabled = value; }
	    }        

        /// <summary>
        /// 选中
        /// </summary>
        public bool Checked { get; set; }

        /// <summary>
        /// 子项
        /// </summary>
        public IContextMenuStripItem[] Sub { get; set; }

        /// <summary>
        /// 用户定义数据
        /// </summary>
        public object Tag { get; set; }
    }

    /// <summary>
    /// 右键菜单分割项
    /// </summary>
    public class ContextMenuStripItemDivider : IContextMenuStripItem { }

    public class IContextMenuStripItem { }
}